package com.mj.listen1._09_Set集合;

import com.mj.listen1._09_Set集合.list.LinkList;
import com.mj.listen1._09_Set集合.list.List;

/**
 * 使用链表实现ListSet集合
 *
 * @param <E>
 */
public class ListSet<E> implements Set<E> {

    // 底层使用链表数据结构
    private List<E> list = new LinkList<>();

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public void clear() {
        list.clear();
    }

    @Override
    public boolean contains(E element) {
        return list.contains(element);
    }

    @Override
    public void add(E element) {
        // 方式1: 不添加重复的元素
        // if (list.contains(element)) return;
        // list.add(element);

        // 方式2: 新元素覆盖掉旧的
        int index = list.indexOf(element);
        if (index != List.ELEMENT_NOT_FOUND) {
            // 说明存在，直接覆盖掉
            list.set(index, element);
        } else {
            // 不存在，直接添加到List
            list.add(element);
        }
    }

    @Override
    public void remove(E element) {
        int index = list.indexOf(element);
        if (index != List.ELEMENT_NOT_FOUND) {
            // 说明存在，存在才去删除
            list.remove(index);
        }
    }

    @Override
    public void traversal(Visitor<E> visitor) {
        if (visitor == null) return;
        int size = list.size();
        for (int i = 0; i < size; i++) {
            // visitor.visit(E e) 返回值为 true，表示停止遍历后续的数据
            if (visitor.visit(list.get(i))) return;
        }
    }
}
